package poker;


import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
//import java.io.StreamCorruptedException;
import java.net.Socket;
import java.net.SocketException;

public class Client extends Thread{
	Deelname deelname;
	public Speler speler;
	public String ip;
	ObjectInputStream in;
	ObjectOutputStream out;
	private Socket socket;
	private String host;
	private int port;
	public Spel spel;
	HoofdSchermGUI hs;
	
	public void run(){
		
		try {
			socket = new Socket(host, port);
			
			
			//System.out.println("Client: setting timeout to 0");
			socket.setSoTimeout(0);
			

			//System.out.println("Client: Getting the input stream!");
			in = new ObjectInputStream(socket.getInputStream());
			//System.out.println("Client: Gotten the input stream!");

			//System.out.println("Client: Getting the output stream!");
			out = new ObjectOutputStream(socket.getOutputStream());
			//System.out.println("Client: Gotten the output stream!");
			
			speler.spelerId = socket.getLocalPort();
			//System.out.println("Client: Sending: "+deelname);
			
			//System.out.println("Client: Ik stuur deelname object");
			out.writeObject(deelname);
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			
			e.printStackTrace();
		}
		
		while(true){
			//System.out.println("Client: Ik wacht op een object!");
			Object gekregen = null;
			try {
				gekregen = in.readObject();
			} catch (IOException e1) {
				System.exit(1);
			} catch (ClassNotFoundException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			
				//throw(new Exception("gekregen == null"));
			if(gekregen == null){
				//System.out.println("Client: Ik heb NULL gekregen!");
			}else
			if(gekregen.getClass().getCanonicalName().equals("poker.Speler")){
				speler = (Speler)gekregen;
			}else if(gekregen.getClass().getCanonicalName().equals("poker.Spel")){
				spel = (Spel)gekregen;
				deelname = spel.sr.zoekDeelname(socket.getLocalPort());
				////System.out.println("Client: Ik heb zelf de volgende deelname gedestilleerd: "+deelname);
				if(deelname != null)
				{
					speler = deelname.getSpeler();
				}

			}else if(gekregen.getClass().getCanonicalName().equals("poker.Deelname")){
				deelname = (Deelname)gekregen;
				speler = deelname.getSpeler();				
			}else if(gekregen.getClass().getCanonicalName().equals("java.lang.String")){
				if(gekregen.equals("Jij bent nu aan de beurt")){
					deelname.geefBeurt(true);
				}else if(gekregen.equals("Ping"))
				{
					////System.out.println("Client: Server zegt Ping! ik antwoord");
					try {
						out.writeObject("Pong!");
					} catch (IOException e) {}
				}  else if (gekregen.equals("Update"))
				{
					hs.ikhebdata();
				}
					
			}else{
				//System.out.println("Client: Ik weet niet wat ik hiermee moet:" + gekregen.getClass().getCanonicalName());
			}
			/*
			while(hs == null && spel != null){
				try {
					gekregen = in.readObject();
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				} catch (ClassNotFoundException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
				if(gekregen.getClass().getCanonicalName().equals("java.lang.String"))
				{
					if(gekregen.equals("Ping"))
					{
						//System.out.println("Client: Server zegt Ping! ik antwoord");
						try {
							out.writeObject("Pong!");
						} catch (IOException e) {}
					}
				}
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}*/
			if(hs!=null){
				hs.ikhebdata();
			}else{
				////System.out.println("Client: ik heb geen HoofdScherm!");
			}

			
			if(deelname != null)
			{
				while(deelname.isAanBeurt){
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						//niets aan de hand, geef spelobject terug
						break;
					}
				}
				if(deelname.isAanBeurt){
					try {
						////System.out.println("Client: Stuur spel: "+spel);
						deelname.isAanBeurt = false;
						out.writeObject(spel);
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		}
	}

	public Client(Speler s, String host, int port) {
		this.host = host;
		this.port = port;
		deelname = new Deelname();
		deelname.setSpeler(s);
		this.speler = s;		
	}
	
	public void up()
	{
		try
		{
			out.writeObject(spel);
		}
		catch(IOException e)
		{
			e.printStackTrace();
		}
		
	}

	public void setHoofdScherm(HoofdSchermGUI hs)
	{
		this.hs = hs;
	}
	
	public String toString()
	{
		return "Client:" + speler.getNaam() + " op " + socket.getLocalAddress().getHostName(); 
	}
}
